home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * member.c - test class membership
- *
- * Copyright (c) 1991 Symantec Corporation. All rights reserved.
- *
- */
-
- #define OOPS_PRIVATE
- #include "oops.h"
-
-
- /*
- * __member - test class membership
- *
- * The compiler, for
- *
- * if (member(obj, C)) ...
- *
- * generates:
- *
- * MOVE._ obj->classID,-(SP)
- * PEA C
- * JSR __member
- * ADDQ.L #?,SP
- * TST.B D0
- *
- * This routine tests class membership by searching the superclass
- * chain for a match on the object's class.
- */
-
- static char
- dummy()
- {
- asm {
-
- ;;
- ;
- ; char __member(void *class, void *objclass) // far version
- ; char __member(void *class, short objclass) // near version
- ;
- ;;
-
- extern __member:
-
- ;;
- ;
- ; set D0 = result (start by assuming "true")
- ; set D1 = class Ref
- ; set D2 = object's class Ref
- ;
- ;;
-
- moveq #1,d0
- move.l 4(sp),d1
- #ifdef BASE_REG
- sub.l BASE_REG,d1
- #endif
- move._ 8(sp),d2
-
- ;;
- ;
- ; compare class Ref's
- ;
- ;;
-
- @1 cmp._ d1,d2
- beq.s @2 ; it's a member
-
- ;;
- ;
- ; advance to superclass
- ;
- ;;
-
- movea._ d2,a0
- #ifdef BASE_REG
- adda.l BASE_REG,a0
- #endif
- moveq #1,d2
- add.w (a0)+,d2
- lsl.w #DSHIFT,d2
- move._ 0(a0,d2.w),d2
- bne.s @1
-
- ;;
- ;
- ; done
- ;
- ;;
-
- moveq #0,d0 ; it's not a member
-
- @2 }
- }
-